package com.hisense.davidmoten.service;

import com.hisense.davidmoten.rtree.Entry;
import com.hisense.davidmoten.rtree.geometry.Circle;
import com.hisense.davidmoten.rtree.geometry.Geometry;
import com.hisense.davidmoten.rtree.geometry.Point;
import com.hisense.davidmoten.rtree.geometry.Rectangle;

import java.io.Serializable;
import java.util.List;

/**
 * <p>@program IntelliJ IDEA</p>
 * <p>@description 空间查询接口</p>
 * <p>@author</p>
 * <p>@create 2020/1/20</p>
 * <p>@version</p>
 */
public interface IRTreeQuery<T, S extends Geometry> extends Serializable {
    /**
     * <p>点查询</p>
     * @Author zy
     * @param point
     * @param distant
     * @return List<Entry<T, S>>
     */
    List<Entry<T, S>> queryByPoint(Point point, double distant);
    /**
     * 圆查询
     * @Author zy
     * @param circle
     * @return List<Entry<T, S>>
     */
    List<Entry<T, S>> queryByCircle(Circle circle);
    /**
     * <p>矩形查询</p>
     * @Author zy
     * @param rectangle
     * @return List<Entry<T, S>>
     */
    List<Entry<T, S>> queryByRectangle(Rectangle rectangle);
    /**
     * <p>查找点位附近最近的几个地理信息</p>
     * @Author zy</p>
     * @param point 基点
     * @param maxDistance 最大距离
     * @param maxCount 最近的数量
     * @return List<Entry<T, S>>
     */
    List<Entry<T, S>> queryNearestByPoint(Point point, double maxDistance, int maxCount);
    /**
     * <p>查找点位附近最近的几个地理信息</p>
     * @Author zy</p>
     * @param  r 参照矩形
     * @param maxDistance 最大距离
     * @param maxCount 最近的数量
     * @return List<Entry<T, S>>
     */
    List<Entry<T, S>> queryNearestByRectangle(Rectangle r, double maxDistance, int maxCount);
}
